// 此vm参数为页面的实例，可以通过它引用vuex中的变量
module.exports = (vm) => {
	// 初始化请求配置
	uni.$u.http.setConfig((config) => {
		/* config 为默认全局配置*/
		//config.baseURL = "/api/";
		config.baseURL = "https://wx.yulinmei.cn/";
		return config;
	});
	// 请求拦截
	uni.$u.http.interceptors.request.use(
		(config) => {
			console.log(config);
			config.data = config.data || {};
			//eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VfbW9YN0x1STQydGpaRFBCIiwiaWF0IjoxNzM5NDIzMzk3LCJleHAiOjE3NDMwMjMzOTd9.GWhbWl9KgA_Q2q45iE3AhIrCZAKRmlKvvOrBahq7zNo
			if(vm.vuex_token){
				config.header["Authorization"] = "Bearer " + vm.vuex_token;
			}
			if (config?.custom?.loading) {
				uni.showLoading({
					title: "加载中",
				});
			}
			return config;
		},
		(config) => {
			return Promise.reject(config);
		}
	);

	function logout() {
		vm.$u.vuex("vuex_token", "");
		vm.$u.vuex("vuex_user", {});
		vm.$u.vuex("vuex_refresh_token", "");
	}
	// 响应拦截
	uni.$u.http.interceptors.response.use(
		(response) => {
			// 自定义参数
			const data = response.data;
			return data;
		},
		(response) => {
			const custom = response.config?.custom;
			// 对响应错误做点什么 （statusCode !== 200）
			if (response.statusCode === 202) {
				// token过期，刷新token,并且重新请求
				// 假设存在一个 refreshToken 函数用于刷新 token
				return vm.$u.http
					.post(
						"/api/user/refreshToken", {}, {
							header: {
								"k-token": vm.vuex_token,
								"k-refresh-token": vm.vuex_refresh_token,
							},
						}
					)
					.then((refreshResponse) => {
						console.log(refreshResponse);
						if (
							refreshResponse.statusCode === 200 &&
							refreshResponse.data.code === 1
						) {
							// 更新 vuex 中的 token 和 refresh_token
							vm.$u.vuex("vuex_token", refreshResponse.data.data.token);
							// 重新发起第一次请求
							const originalRequest = response.config;
							return uni.$u.http.request(originalRequest);
						} else {
							// 刷新 token 失败，处理登录失效
							logout();
							uni.$u.toast("刷新token失败，请重新登录");
							return Promise.reject(refreshResponse);
						}
					})
					.catch((error) => {
						// 处理刷新 token 请求的错误
						logout();
						uni.$u.toast("刷新token请求出错，请重新登录");
						return Promise.reject(error);
					});
			} else if (response.statusCode === 401 || response.statusCode === 403) {
				//登录失效
				logout();
				uni.$u.toast(response.data?.detail || '请求数据失败');
				if (custom?.catch) {
					return Promise.reject(data);
				} else {
					// 否则返回一个pending中的promise，请求不会进入catch中
					return new Promise(() => {});
				}
			} else {
				uni.$u.toast(response.data?.detail || '请求数据失败');
			}
			return Promise.reject(response);
		}
	);
};